package com.ruoyi;

import com.ruoyi.common.utils.http.HttpUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;
import java.util.Date;

import java.util.Properties;

/**

 * Java 发送邮件

 */

public class JavaSendMailDemo {

    /**
     * 邮箱账户
     */
    public static String emailAddress = "qgqcleg@163.com";
    /**
     * 授权码 */
    public static String emailPassword = "UKg9k39pgmCBY562";
// 发件人邮箱的SMTP服务器地址
    public static String smtpHost = "smtp.163.com";
    public static void sendEmail(String userEmailAddress, String code) throws Exception {
// 1. 创建参数配置，用于连接邮件服务器的参数配置
        Properties props = new Properties();
// 使用的协议（JavaMail规范要求）
        props.setProperty("mail.transport.protocol", "smtp");
// 发件人邮箱的SMTP服务器地址
        props.setProperty("mail.smtp.host", smtpHost);
// 是否需要请求认证
        props.setProperty("mail.smtp.auth", "true");
// 2. 根据配置创建会话对象，用于和邮件服务器进行交互
        Session session = Session.getInstance(props);
// 设置为debug模式，观察详细的发送日志
        session.setDebug(true);
// 3. 创建一封邮件
        MimeMessage message = createMimeMessage(session,emailAddress,userEmailAddress,code);
// 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();
//5. 输入邮箱账号和密码连接邮件服务器，这里认证的邮箱必须与message中的发件人邮箱一致，否则会报错
        transport.connect(emailAddress, emailPassword);
// 6.给所有的收件地址发送邮件，message.getAllRecipients() 获取的是在 创建邮件对象时添加的所有收件人、抄送人、密送人
        transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
        transport.close();
        System.out.println("完成邮件的发送");
    }

    public static void main(String[] args) throws Exception {
// 1. 创建参数配置，用于连接邮件服务器的参数配置
        Properties props = new Properties();
// 使用的协议（JavaMail规范要求）
        props.setProperty("mail.transport.protocol", "smtp");
// 发件人邮箱的SMTP服务器地址
        props.setProperty("mail.smtp.host", smtpHost);
// 是否需要请求认证
        props.setProperty("mail.smtp.auth", "true");
// 2. 根据配置创建会话对象，用于和邮件服务器进行交互
        Session session = Session.getInstance(props);
// 设置为debug模式，观察详细的发送日志
        session.setDebug(true);
// 3. 创建一封邮件
        MimeMessage message = createMimeMessage(session,emailAddress,"1173759990@qq.com","123123");
// 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();
//5. 输入邮箱账号和密码连接邮件服务器，这里认证的邮箱必须与message中的发件人邮箱一致，否则会报错
        transport.connect(emailAddress, emailPassword);
// 6.给所有的收件地址发送邮件，message.getAllRecipients() 获取的是在 创建邮件对象时添加的所有收件人、抄送人、密送人
        transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
        transport.close();
        System.out.println("完成邮件的发送");
    }

    /**

     * 创建一封只包含文本的简单邮件

     * @param session 和服务器交互的会话

     * @param sendMailAddress 发件人邮箱

     * @param receiveMailAddress 收件人邮箱

     * @return * @throws Exception

     */

    public static MimeMessage createMimeMessage(Session session,String sendMailAddress,String receiveMailAddress,String code) throws Exception {
// 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
        message.setFrom(new InternetAddress(sendMailAddress, "MIKE SHOP","UTF-8"));
// 3. To: 收件人（可以增加多个收件人、抄送和密送）
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMailAddress, "你好", "UTF-8"));
// 4. Subject: 邮件主题
        message.setSubject("mike注册验证码", "UTF-8");

        message.setContent(buildContent(code),"text/html;charset=UTF-8");

// 6. 设置发件时间
        message.setSentDate(new Date());
// 7. 保存设置
        message.saveChanges();
        return message;

    }

    /**
     * 读取邮件模板
     * 替换模板中的信息
     *
     * @param title 内容
     * @return
     */
    public static String buildContent(String title) {
        //加载邮件html模板
        Resource resource = new ClassPathResource("mailtemplate.ftl");
        InputStream inputStream = null;
        BufferedReader fileReader = null;
        StringBuffer buffer = new StringBuffer();
        String line = "";
        try {
            inputStream = resource.getInputStream();
            fileReader = new BufferedReader(new InputStreamReader(inputStream));
            while ((line = fileReader.readLine()) != null) {
                buffer.append(line);
            }
        } catch (Exception e) {
            System.out.println("发送邮件读取模板失败");
        } finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //替换html模板中的参数
        return MessageFormat.format(buffer.toString(), title);
    }
}